﻿namespace XYAC.Framework.MonitorTireMaterialManual.DataExporter
{
    /// <summary>
    /// 提供用于计算移动平均值和中值的静态方法。
    /// </summary>
    public class Average
    {
        /// <summary>
        /// 计算给定列表的中值处理。
        /// </summary>
        /// <param name="vals">浮点数列表。</param>
        /// <param name="length">窗口大小，用于计算中值。</param>
        /// <returns>经过中值处理后的浮点数列表。</returns>
        public static List<float> MiddleList(List<float> vals, int length)
        {
            List<float> list = new List<float>();
            for (int i = 0; i < vals.Count; i++)
            {
                if ((i < length) || (i > (vals.Count - length)))
                {
                    // 如果当前索引小于窗口长度或超过列表范围，则保留原值
                    list.Add((float)Math.Round(vals[i], 2));
                }
                else
                {
                    // 在窗口范围内，获取中值
                    List<float> list2 = new List<float>();
                    for (int j = i - length; j < (i + length); j++)
                    {
                        list2.Add(vals[j]);
                    }
                    list2.Sort();
                    list.Add((float)Math.Round(list2[list2.Count / 2], 2));
                }
            }
            return list;
        }

        /// <summary>
        /// 计算给定列表的移动平均值。
        /// </summary>
        /// <param name="vals">浮点数列表。</param>
        /// <param name="length">窗口大小，用于计算平均值。</param>
        /// <returns>经过移动平均处理后的浮点数列表。</returns>
        public static List<float> MovingList(List<float> vals, int length)
        {
            List<float> list = new List<float>();
            for (int i = 0; i < vals.Count; i++)
            {
                if ((i < length) || (i > (vals.Count - length)))
                {
                    // 如果当前索引小于窗口长度或超过列表范围，则保留原值
                    list.Add((float)Math.Round(vals[i], 2));
                }
                else
                {
                    // 在窗口范围内，计算平均值
                    float sum = 0f;
                    for (int j = i - length; j < (i + length); j++)
                    {
                        sum += vals[j];
                    }
                    list.Add(sum / (2 * length));
                }
            }
            return list;
        }
    }

}
